#pragma once
#include<string>
#include <unistd.h>
#include <sys/wait.h>
#include <cstdlib>
#include"../comm/log.hpp"
#include"../comm/FileTools.hpp"

//指定.cpp文件，程序替换并进行编译即可
using namespace Ns_Log;
using namespace Ns_FileTools;
class Compiler
{
public:
    static bool compile(const std::string& filename)
    {
        //创建子进程
        pid_t pid = fork();
        if (pid==-1)
        {
            log(ERROR,"编译前的子进程创建失败");
            return false;
        }
        else if(pid==0)//子进程
        {
            //文件重定向
            if(!FileTools::FileRedirection(filename+".stdin",0)||
            !FileTools::FileRedirection(filename+".stdout",1)||
            !FileTools::FileRedirection(filename+".stderr",2))
            {
                log(ERROR,"编译时文件重定向失败");
                return false;
            }
            //程序替换g++
            execl("/usr/bin/g++", "g++", (filename+".cpp").c_str(), "-o", filename.c_str(),NULL);
            return false;
        }
        else//父进程
        {
            int status;
            waitpid(pid, &status, 0);
            log(INFO, "编译完成，编译子进程退出，状态码: "+std::to_string(status));
            if(status==0)
            return true;
            else
            return false;
        }
    }
};